3.08. Справочник по Oracle DB
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Справочник по Oracle DB
1. Архитектура Oracle Database
1.1. Основные компоненты экземпляра
Экземпляр Oracle состоит из двух основных компонентов:
- Память (System Global Area, SGA)
- Процессы (Background и Server Processes)
System Global Area (SGA)
SGA — это совместно используемая память, выделяемая при запуске экземпляра. Она включает:
- Database Buffer Cache — кэш блоков данных, считанных из файлов данных.
- Redo Log Buffer — буфер для хранения записей redo до их записи в online redo log файлы.
- Shared Pool — содержит:
- Library Cache (SQL-запросы, PL/SQL-блоки, курсоры)
- Data Dictionary Cache (метаданные о структуре БД)
- Large Pool — используется для операций резервного копирования, RMAN, параллельного выполнения запросов.
- Java Pool — память для JVM в базе (при использовании Java-процедур).
- Streams Pool — используется Oracle Streams (устаревшая технология).
- Result Cache — кэш результатов SQL-запросов и PL/SQL-функций.
Процессы
Фоновые процессы (Background Processes):
- PMON (Process Monitor) — очищает ресурсы после аварийного завершения пользовательских процессов.
- SMON (System Monitor) — выполняет восстановление экземпляра, коалесценцию свободного пространства.
- DBWn (Database Writer) — записывает изменённые блоки из buffer cache в файлы данных.
- LGWR (Log Writer) — записывает содержимое redo log buffer в online redo log файлы.
- CKPT (Checkpoint) — сигнализирует DBWn о необходимости записи и обновляет контрольные точки в файлах управления и данных.
- ARCn (Archiver) — архивирует online redo log файлы при включённом режиме ARCHIVELOG.
- MMON, MMNL — мониторинг и сбор статистики AWR.
- LREG — регистрирует службу в listener (начиная с 12c).
Серверные процессы (Server Processes): Обрабатывают запросы пользователей, читают данные из диска в SGA, выполняют SQL.
2. Физическая структура базы данных
2.1. Файлы данных (Data Files)
- Хранят данные таблиц, индексов, LOB-объектов.
- Принадлежат одному табличному пространству (tablespace).
- Имеют расширение
.dbfили.ora.
2.2. Файлы управления (Control Files)
- Содержат метаданные о структуре БД: имена файлов данных, redo log файлов, состояние БД, SCN.
- Обычно дублируются для отказоустойчивости.
- Расширение
.ctl.
2.3. Online Redo Log Files
- Циклические файлы, содержащие изменения, внесённые в БД.
- Группы redo log файлов (обычно минимум две группы, по два файла в каждой).
- При переключении группы (log switch) происходит checkpoint.
2.4. Archive Log Files
- Копии online redo log файлов, сохраняемые при включённом режиме ARCHIVELOG.
- Используются для восстановления на момент времени (point-in-time recovery).
2.5. Password File
- Хранит учётные данные пользователей с привилегиями
SYSDBA,SYSOPER. - Необходим для удалённого администрирования.
2.6. Parameter File (PFILE / SPFILE)
- PFILE — текстовый файл (
init<SID>.ora), редактируется вручную. - SPFILE — двоичный файл (
spfile<SID>.ora), управляется через SQL. - Содержит параметры запуска экземпляра.
3. Параметры инициализации (Initialization Parameters)
Oracle поддерживает более 300 параметров. Ниже — ключевые категории и часто используемые параметры.
3.1. Память
| Параметр | Описание |
|---|---|
MEMORY_TARGET | Автоматическое управление SGA + PGA (AMM). |
MEMORY_MAX_TARGET | Максимальный объём памяти для AMM. |
SGA_TARGET | Автоматическое управление компонентами SGA (ASMM). |
SGA_MAX_SIZE | Максимальный размер SGA. |
PGA_AGGREGATE_TARGET | Целевой объём PGA для всех сессий. |
3.2. Файлы и пути
| Параметр | Описание |
|---|---|
DB_NAME | Имя базы данных (до 8 символов). |
DB_UNIQUE_NAME | Уникальное имя в Data Guard конфигурации. |
CONTROL_FILES | Список путей к control files. |
DB_CREATE_FILE_DEST | Путь по умолчанию для автоматического создания файлов (OMF). |
DB_RECOVERY_FILE_DEST | Каталог для архивных логов, резервных копий, flashback logs. |
DB_RECOVERY_FILE_DEST_SIZE | Максимальный размер FRA (Fast Recovery Area). |
3.3. Режимы работы
| Параметр | Описание |
|---|---|
ARCHIVELOG / NOARCHIVELOG | Устанавливается командой, не параметром. |
COMPATIBLE | Минимальная версия Oracle, с которой совместима БД. |
OPEN_CURSORS | Максимальное число открытых курсоров на сессию. |
PROCESSES | Максимальное число процессов (включая фоновые). |
SESSIONS | Максимальное число сессий (автоматически ≈ 1.1 × PROCESSES + 5). |
3.4. Безопасность
| Параметр | Описание |
|---|---|
REMOTE_LOGIN_PASSWORDFILE | EXCLUSIVE, SHARED, NONE — управление password file. |
AUDIT_TRAIL | DB, OS, XML — включение аудита. |
SEC_CASE_SENSITIVE_LOGON | Чувствительность к регистру при входе. |
3.5. Оптимизатор
| Параметр | Описание |
|---|---|
OPTIMIZER_MODE | ALL_ROWS, FIRST_ROWS_n, CHOOSE (устарело). |
OPTIMIZER_FEATURES_ENABLE | Версия оптимизатора (например, '19.1.0'). |
CURSOR_SHARING | EXACT, FORCE, SIMILAR — управление общими курсорами. |
4. Типы данных Oracle
4.1. Числовые
NUMBER(p, s)— произвольная точность.INTEGER,SMALLINT,DECIMAL— псевдонимы NUMBER.BINARY_FLOAT,BINARY_DOUBLE— IEEE 754 числа с плавающей точкой.
4.2. Символьные
CHAR(n)— фиксированная длина (до 2000 байт).VARCHAR2(n)— переменная длина (до 4000 байт; 32767 приMAX_STRING_SIZE=EXTENDED).NCHAR,NVARCHAR2— Unicode (AL16UTF16 или UTF8).CLOB,NCLOB— большие текстовые объекты (до 128 TB).
4.3. Дата и время
DATE— дата и время (точность до секунды).TIMESTAMP— с микросекундами.TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONEINTERVAL YEAR TO MONTHINTERVAL DAY TO SECOND
4.4. Бинарные
RAW(n)— до 2000 байт.LONG RAW— устаревший (до 2 GB).BLOB— двоичные данные (до 128 TB).BFILE— указатель на внешний файл.
4.5. Прочие
ROWID— уникальный адрес строки.UROWID— универсальный ROWID (для индексов IOT).XMLType— хранение XML-документов.JSON— начиная с 12c, поддержка JSON через VARCHAR2/CLOB/BLOB с проверкой.
5. Встроенные SQL-функции
5.1. Числовые
ABS,CEIL,FLOOR,ROUND,TRUNCMOD,POWER,SQRT,EXP,LN,LOGSIGN,BITAND
5.2. Строковые
UPPER,LOWER,INITCAPSUBSTR,INSTR,LENGTH,LPAD,RPADTRIM,LTRIM,RTRIMREPLACE,TRANSLATECONCAT(или||)REGEXP_SUBSTR,REGEXP_REPLACE,REGEXP_LIKE,REGEXP_INSTR
5.3. Дата/время
SYSDATE,SYSTIMESTAMP,CURRENT_DATEADD_MONTHS,MONTHS_BETWEENNEXT_DAY,LAST_DAYEXTRACT(YEAR FROM ...),EXTRACT(MONTH FROM ...)NUMTODSINTERVAL,NUMTOYMINTERVAL
5.4. Преобразования
TO_CHAR,TO_DATE,TO_TIMESTAMPTO_NUMBERCAST(...) AS ...NVL,NVL2,COALESCEDECODE,CASE
5.5. Агрегатные
SUM,AVG,MIN,MAX,COUNTSTDDEV,VARIANCELISTAGG— конкатенация строкMEDIAN,PERCENTILE_CONT,PERCENTILE_DISC
5.6. Аналитические
ROW_NUMBER(),RANK(),DENSE_RANK()LEAD,LAGFIRST_VALUE,LAST_VALUENTILEOVER (PARTITION BY ... ORDER BY ...)
6. Системные представления (Data Dictionary Views)
6.1. Общие префиксы
USER_*— объекты текущего пользователя.ALL_*— объекты, доступные текущему пользователю.DBA_*— все объекты в БД (требуют привилегий).V$*— динамические представления производительности (на основе X$ таблиц).
6.2. Часто используемые представления
| Представление | Назначение |
|---|---|
DBA_TABLES | Все таблицы в БД. |
DBA_INDEXES | Все индексы. |
DBA_USERS | Пользователи. |
DBA_ROLES | Роли. |
DBA_SYS_PRIVS | Системные привилегии. |
DBA_TAB_PRIVS | Привилегии на объекты. |
V$SESSION | Активные сессии. |
V$PROCESS | Процессы ОС. |
V$SQL | Кэш SQL-запросов. |
V$LOCK, V$SESSION_WAIT | Блокировки и ожидания. |
V$PARAMETER | Текущие параметры. |
V$DATAFILE, V$CONTROLFILE, V$LOG | Физические файлы. |
DBA_SEGMENTS | Сегменты (таблицы, индексы и т.д.). |
DBA_EXTENTS | Экстенты сегментов. |
DBA_FREE_SPACE | Свободное место в табличных пространствах. |
7. Управление пользователями и привилегиями
7.1. Создание пользователя
CREATE USER username IDENTIFIED BY password
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 100M ON users;
7.2. Привилегии
Системные:
CREATE SESSIONCREATE TABLECREATE VIEWCREATE PROCEDUREUNLIMITED TABLESPACE
Объектные:
SELECT,INSERT,UPDATE,DELETEна таблицуEXECUTEна процедуруREFERENCESна внешний ключ
Роли:
CONNECT,RESOURCE,DBA(устаревшие, но используются)PDB_DBA(в multitenant)
7.3. Аудит
AUDIT SELECT ON schema.table;
AUDIT CREATE SESSION WHENEVER SUCCESSFUL;
NOAUDIT ...;
8. Табличные пространства и сегменты
8.1. Типы табличных пространств
- Permanent — для постоянных данных.
- Temporary — для временных сегментов (сортировки, хэши).
- Undo — для хранения undo-информации (автоматически управляется).
8.2. Создание
CREATE TABLESPACE tbs1 DATAFILE '/u01/oradata/orcl/tbs01.dbf' SIZE 100M;
CREATE TEMPORARY TABLESPACE temp_tbs TEMPFILE '/u01/oradata/orcl/temp01.dbf' SIZE 50M;
8.3. Управление квотами
ALTER USER scott QUOTA UNLIMITED ON users;
ALTER USER scott QUOTA 50M ON tbs1;
9. Резервное копирование и восстановление
9.1. Режимы
- NOARCHIVELOG — только полное восстановление до последнего backup.
- ARCHIVELOG — восстановление до любого момента времени.
9.2. RMAN (Recovery Manager)
Основные команды:
RMAN TARGET /
BACKUP DATABASE;
BACKUP ARCHIVELOG ALL;
BACKUP CURRENT CONTROLFILE;
RESTORE DATABASE;
RECOVER DATABASE;
LIST BACKUP;
REPORT OBSOLETE;
DELETE OBSOLETE;
9.3. Flashback
FLASHBACK DATABASE— откат всей БД.FLASHBACK TABLE— откат таблицы.FLASHBACK QUERY— запрос к состоянию таблицы в прошлом:SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
10. PL/SQL — Процедурное расширение SQL
10.1. Базовая структура блока
DECLARE
-- объявления переменных, курсоров, типов
BEGIN
-- исполняемая часть
EXCEPTION
-- обработка ошибок
END;
Анонимные блоки не сохраняются в БД. Именованные объекты (процедуры, функции, пакеты) хранятся в словаре данных.
10.2. Типы данных в PL/SQL
- Скалярные:
NUMBER,VARCHAR2,DATE,BOOLEAN - Составные:
RECORD,TABLE(ассоциативные массивы, nested tables, VARRAY) - Ссылочные:
REF CURSOR - LOB:
CLOB,BLOB
10.3. Переменные и константы
v_name VARCHAR2(100) := 'John';
c_pi CONSTANT NUMBER := 3.14159;
10.4. Условные конструкции
IF condition THEN
...
ELSIF condition2 THEN
...
ELSE
...
END IF;
10.5. Циклы
-- Простой цикл
LOOP
EXIT WHEN condition;
END LOOP;
-- Цикл с условием
WHILE condition LOOP
...
END LOOP;
-- Цикл по диапазону
FOR i IN 1..10 LOOP
...
END LOOP;
10.6. Курсоры
Неявный курсор — используется автоматически при выполнении DML.
Явный курсор:
DECLARE
CURSOR emp_cur IS
SELECT employee_id, last_name FROM employees WHERE department_id = 10;
v_emp emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO v_emp;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp.last_name);
END LOOP;
CLOSE emp_cur;
END;
Курсор с параметрами:
CURSOR emp_cur(dept_id NUMBER) IS
SELECT * FROM employees WHERE department_id = dept_id;
Курсор FOR-LOOP (автоматическое открытие/закрытие):
FOR rec IN (SELECT * FROM employees WHERE salary > 5000) LOOP
DBMS_OUTPUT.PUT_LINE(rec.last_name);
END LOOP;
10.7. Обработка исключений
EXCEPTION
WHEN NO_DATA_FOUND THEN
...
WHEN TOO_MANY_ROWS THEN
...
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
Предопределённые исключения:
NO_DATA_FOUNDTOO_MANY_ROWSDUP_VAL_ON_INDEXINVALID_NUMBERZERO_DIVIDEPROGRAM_ERROR
Пользовательские исключения:
DECLARE
e_custom EXCEPTION;
BEGIN
RAISE e_custom;
EXCEPTION
WHEN e_custom THEN
...
END;
Использование PRAGMA EXCEPTION_INIT для привязки к ORA-кодам:
PRAGMA EXCEPTION_INIT(e_timeout, -3135);
10.8. Хранимые процедуры и функции
Процедура:
CREATE OR REPLACE PROCEDURE raise_salary (
p_emp_id IN NUMBER,
p_amount IN NUMBER DEFAULT 100
) AS
BEGIN
UPDATE employees SET salary = salary + p_amount
WHERE employee_id = p_emp_id;
COMMIT;
END;
Функция:
CREATE OR REPLACE FUNCTION get_dept_name(p_dept_id NUMBER) RETURN VARCHAR2 IS
v_name departments.department_name%TYPE;
BEGIN
SELECT department_name INTO v_name
FROM departments WHERE department_id = p_dept_id;
RETURN v_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN NULL;
END;
Вызов:
EXEC raise_salary(101, 200);
SELECT get_dept_name(10) FROM dual;
10.9. Пакеты (Packages)
Пакет состоит из спецификации (интерфейс) и тела (реализация).
Спецификация:
CREATE OR REPLACE PACKAGE emp_pkg AS
PROCEDURE hire_employee(p_name VARCHAR2, p_salary NUMBER);
FUNCTION get_salary(p_id NUMBER) RETURN NUMBER;
g_counter NUMBER := 0; -- глобальная переменная
END emp_pkg;
Тело:
CREATE OR REPLACE PACKAGE BODY emp_pkg AS
PROCEDURE hire_employee(p_name VARCHAR2, p_salary NUMBER) IS
BEGIN
INSERT INTO employees (employee_id, last_name, salary)
VALUES (emp_seq.NEXTVAL, p_name, p_salary);
g_counter := g_counter + 1;
END;
FUNCTION get_salary(p_id NUMBER) RETURN NUMBER IS
v_sal NUMBER;
BEGIN
SELECT salary INTO v_sal FROM employees WHERE employee_id = p_id;
RETURN v_sal;
END;
END emp_pkg;
Пакеты поддерживают перегрузку процедур/функций и инициализацию через блок BEGIN ... END; в теле.
11. Триггеры
11.1. Типы триггеров
- DML-триггеры:
BEFORE/AFTERнаINSERT,UPDATE,DELETE - INSTEAD OF — для представлений
- DDL-триггеры: на
CREATE,DROP,ALTER - Системные триггеры:
LOGON,LOGOFF,STARTUP,SHUTDOWN
11.2. Пример DML-триггера
CREATE OR REPLACE TRIGGER trg_emp_audit
AFTER UPDATE ON employees
FOR EACH ROW
DECLARE
v_user VARCHAR2(30) := USER;
BEGIN
INSERT INTO emp_audit (emp_id, old_sal, new_sal, changed_by, change_date)
VALUES (:OLD.employee_id, :OLD.salary, :NEW.salary, v_user, SYSDATE);
END;
:OLD и :NEW — псевдозаписи для значений до и после изменения.
11.3. Мутационные таблицы
Обновление таблицы внутри триггера на ту же таблицу вызывает ошибку ORA-04091. Решение — использование составного триггера (COMPOUND TRIGGER) или временных таблиц.
12. Индексы
12.1. Типы индексов
- B-tree — стандартный индекс.
- Bitmap — для колонок с низкой кардинальностью (пол, статус).
- Function-based — индекс по выражению:
CREATE INDEX idx_upper_name ON employees(UPPER(last_name)); - Reverse key — для уменьшения горячих блоков при последовательных вставках.
- Domain (Text) — для полнотекстового поиска (
CTXSYS.CONTEXT). - Spatial, XMLIndex, JSON Search Index — специализированные.
12.2. Управление индексами
ALTER INDEX idx_name REBUILD;
ALTER INDEX idx_name MONITORING USAGE;
DROP INDEX idx_name;
Индексы автоматически неактивны при UNUSABLE состоянии (например, после MOVE таблицы).
13. Партиционирование
13.1. Типы партиционирования
- Range — по диапазону (дата, число)
- List — по списку значений
- Hash — равномерное распределение
- Composite — комбинация (например, range-hash)
13.2. Пример
CREATE TABLE sales (
sale_id NUMBER,
sale_date DATE,
amount NUMBER
)
PARTITION BY RANGE (sale_date) (
PARTITION p_2024 VALUES LESS THAN (DATE '2025-01-01'),
PARTITION p_2025 VALUES LESS THAN (DATE '2026-01-01')
);
13.3. Преимущества
- Ускорение запросов (partition pruning)
- Упрощение обслуживания (удаление целой партиции)
- Улучшение параллелизма
14. Производительность и мониторинг
14.1. AWR (Automatic Workload Repository)
Сбор статистики каждые часы (по умолчанию). Используется для анализа производительности.
-- Создать отчёт
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
14.2. ADDM (Automatic Database Diagnostic Monitor)
Анализирует AWR и даёт рекомендации.
14.3. SQL Tuning Advisor
DECLARE
task_name VARCHAR2(30);
BEGIN
task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => 'SELECT * FROM employees WHERE department_id = 10',
time_limit => 60
);
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name);
END;
14.4. Ожидания (Waits)
Ключевые события:
db file sequential read— индексные чтенияdb file scattered read— full table scanenq: TX - row lock contention— блокировки строкlog file sync— медленный COMMIT
14.5. План выполнения
EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
Или в реальном времени:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
15. Безопасность
15.1. Привилегии
- Системные:
CREATE SESSION,CREATE TABLE - Объектные:
SELECT,EXECUTE - Роли:
CONNECT,RESOURCE,DBA
15.2. Аудит
AUDIT SELECT ON hr.employees BY ACCESS;
AUDIT CREATE ANY TABLE BY hr BY SESSION;
Аудит можно включить через AUDIT_TRAIL = DB, EXTENDED.
15.3. Transparent Data Encryption (TDE)
Шифрование табличных пространств:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "password";
ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY IDENTIFIED BY "password";
CREATE TABLESPACE secure_tbs DATAFILE ... ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
16. Multitenant Architecture (начиная с 12c)
- CDB (Container Database) — корневой контейнер.
- PDB (Pluggable Database) — подключаемая БД, изолированная логически.
Управление:
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdb1admin IDENTIFIED BY password;
ALTER PLUGGABLE DATABASE pdb1 OPEN;
ALTER SESSION SET CONTAINER = pdb1;
17. Высокая доступность и репликация
17.1. Oracle Data Guard
Data Guard обеспечивает защиту от сбоев через поддержание одной или нескольких резервных копий базы данных.
Типы standby-баз:
- Physical Standby — точная побайтовая копия, применяет redo-записи.
- Logical Standby — логическая копия, применяет SQL-транзакции; допускает локальные изменения.
- Snapshot Standby — временно конвертируется в читаемо-записываемую БД для тестирования.
Режимы защиты:
- Maximum Performance — асинхронная передача redo (по умолчанию).
- Maximum Availability — синхронная передача с автоматическим failover при использовании Fast-Start Failover.
- Maximum Protection — синхронная передача; первичная БД останавливается при недоступности standby.
Управление через DGMGRL:
DGMGRL> CONNECT sys/password@primary
DGMGRL> CREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS primary_db CONNECT IDENTIFIER IS primary;
DGMGRL> ADD DATABASE standby_db AS CONNECT IDENTIFIER IS standby;
DGMGRL> ENABLE CONFIGURATION;
DGMGRL> FAILOVER TO standby_db;
Ключевые представления:
V$DATAGUARD_STATSV$ARCHIVED_LOGV$DATAGUARD_PROCESS
17.2. Real Application Clusters (RAC)
RAC — кластер из нескольких узлов, работающих с одной общей базой данных.
Компоненты:
- Shared Storage — ASM (Automatic Storage Management) или сторонние решения.
- Clusterware — Oracle Cluster Registry (OCR), Voting Disk.
- SCAN (Single Client Access Name) — единое имя для подключения клиентов.
Администрирование:
srvctl start database -d orcl
srvctl stop instance -d orcl -i orcl1
crsctl check cluster
Представления:
GV$SESSION— сессии по всем узламGV$INSTANCEGV$LOCK
18. Планировщик заданий (DBMS_SCHEDULER)
18.1. Создание задания
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'nightly_backup',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN backup_proc; END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2',
enabled => TRUE
);
END;
18.2. Типы заданий
PLSQL_BLOCKSTORED_PROCEDUREEXECUTABLE— запуск ОС-команд (требует credentials)CHAIN— последовательность шагов с условиями перехода
18.3. Управление
DBMS_SCHEDULER.RUN_JOB('nightly_backup');
DBMS_SCHEDULER.DISABLE('nightly_backup');
DBMS_SCHEDULER.DROP_JOB('nightly_backup');
18.4. Мониторинг
DBA_SCHEDULER_JOBSDBA_SCHEDULER_JOB_RUN_DETAILSDBA_SCHEDULER_JOB_LOG
19. Материализованные представления (Materialized Views)
Используются для кэширования результатов сложных запросов, особенно в хранилищах данных.
19.1. Создание
CREATE MATERIALIZED VIEW mv_sales_summary
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
AS
SELECT department_id, SUM(salary) total_sal
FROM employees
GROUP BY department_id;
19.2. Типы обновления
- COMPLETE — полная перестройка
- FAST — инкрементальное обновление (требует materialized view log)
- FORCE — пытается FAST, иначе COMPLETE
19.3. Materialized View Log
CREATE MATERIALIZED VIEW LOG ON employees
WITH PRIMARY KEY, ROWID, SEQUENCE (salary, department_id)
INCLUDING NEW VALUES;
19.4. Query Rewrite
Если включено, оптимизатор может автоматически использовать MV вместо исходных таблиц:
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;
ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
20. Внешние таблицы (External Tables)
Позволяют читать данные из файлов ОС как из обычных таблиц.
20.1. Создание
CREATE DIRECTORY ext_dir AS '/u01/ext_data';
CREATE TABLE ext_employees (
emp_id NUMBER,
name VARCHAR2(50),
salary NUMBER
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_dir
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
)
LOCATION ('employees.csv')
)
REJECT LIMIT UNLIMITED;
20.2. Использование
Только для чтения. Поддерживает параллельную загрузку.
21. Работа с JSON
Начиная с Oracle 12c, встроена поддержка JSON.
21.1. Хранение
CREATE TABLE json_docs (
id NUMBER,
doc CLOB CHECK (doc IS JSON)
);
21.2. Запросы
SELECT j.doc.name FROM json_docs j
WHERE JSON_EXISTS(j.doc, '$.address.city');
SELECT JSON_VALUE(doc, '$.name') FROM json_docs;
SELECT JSON_QUERY(doc, '$.orders') FROM json_docs;
21.3. Индексирование
CREATE INDEX idx_json_name ON json_docs (JSON_VALUE(doc, '$.name' RETURNING VARCHAR2(50)));
-- Или функциональный индекс:
CREATE INDEX idx_json_func ON json_docs (JSON_VALUE(doc, '$.age' RETURNING NUMBER));
22. Работа с XML
22.1. Тип XMLType
CREATE TABLE xml_docs (
id NUMBER,
doc XMLType
);
22.2. Запросы
SELECT EXTRACT(doc, '/book/title') FROM xml_docs;
SELECT EXTRACTVALUE(doc, '/book/author') FROM xml_docs;
-- Использование XQuery
SELECT XMLQuery('//title' PASSING doc RETURNING CONTENT) FROM xml_docs;
22.3. Индексы
- XMLIndex — для ускорения XPath-запросов
- Function-based — на основе
EXTRACTVALUE
23. Практические административные сценарии
23.1. Перемещение таблицы в другое табличное пространство
ALTER TABLE employees MOVE TABLESPACE new_tbs;
-- Перестроить индексы
ALTER INDEX emp_pk REBUILD;
23.2. Сжатие таблицы
ALTER TABLE sales MOVE COMPRESS FOR OLTP;
-- Или для партиций
ALTER TABLE sales MOVE PARTITION p_2024 COMPRESS;
23.3. Анализ статистики
EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('HR');
EXEC DBMS_STATS.GATHER_DATABASE_STATS;
23.4. Поиск блокировок
SELECT s1.username || '@' || s1.machine || ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
FROM v$lock l1, v$session s1, v$lock l2, v$session s2
WHERE s1.sid = l1.sid AND s2.sid = l2.sid
AND l1.BLOCK = 1 AND l2.request > 0
AND l1.id1 = l2.id1 AND l1.id2 = l2.id2;
23.5. Убить сессию
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
24. Управление ресурсами (Resource Manager)
Позволяет распределять CPU, параллелизм и другие ресурсы между группами пользователей.
24.1. Создание плана
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('OLTP_USERS', 'High priority');
DBMS_RESOURCE_MANAGER.CREATE_PLAN('DAY_PLAN', 'Daytime plan');
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'DAY_PLAN',
group_or_subplan => 'OLTP_USERS',
cpu_p1 => 80
);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
24.2. Назначение пользователя группе
EXEC DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
attribute => 'ORACLE_USER',
value => 'APP_USER',
consumer_group => 'OLTP_USERS'
);
24.3. Активация плана
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DAY_PLAN';
25. Миграция и обновление
25.1. Обновление версии Oracle
Oracle поддерживает два основных подхода:
- In-place upgrade — обновление существующего экземпляра.
- Data Pump migration — экспорт/импорт через
expdp/impdp.
Этапы in-place upgrade:
-
Проверка совместимости:
SET SERVEROUTPUT ON;
DECLARE
ret VARCHAR2(100);
BEGIN
ret := DBMS_DB_VERSION.CHECK_COMPONENT('Oracle Server', '19.0.0.0.0');
DBMS_OUTPUT.PUT_LINE(ret);
END; -
Запуск Pre-Upgrade Information Tool:
$ORACLE_HOME/jdk/bin/java -jar /u01/preupgrade.jar TERMINAL TEXT -
Резервное копирование всей БД.
-
Выполнение скриптов
catctl.pl:cd $ORACLE_HOME/rdbms/admin
$ORACLE_HOME/perl/bin/perl catctl.pl -n 4 catupgrd.sql -
Пост-апгрейд проверки и компиляция недействительных объектов.
25.2. Миграция с других СУБД
Используется Oracle SQL Developer Migration Workbench:
- Поддерживает миграцию из MySQL, SQL Server, Sybase, Access.
- Автоматически конвертирует типы данных, синтаксис, хранимые процедуры.
- Генерирует отчёт о несовместимостях.
25.3. Data Pump (expdp/impdp)
Экспорт схемы:
expdp system/password DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr
Импорт с переносом:
impdp system/password DIRECTORY=dp_dir DUMPFILE=hr.dmp REMAP_SCHEMA=hr:hr_new
Параметры:
CONTENT=ALL|DATA_ONLY|METADATA_ONLYEXCLUDE=STATISTICS,INDEXPARALLEL=N
26. Диагностика ошибок (ORA-коды)
26.1. Часто встречающиеся ошибки
| Код | Описание | Решение |
|---|---|---|
| ORA-00001 | Нарушение уникального ограничения | Проверить данные или временно отключить индекс |
| ORA-00942 | Таблица или представление не существует | Проверить имя, привилегии, регистр |
| ORA-01031 | Недостаточно привилегий | Запросить GRANT или использовать учётную запись с правами |
| ORA-01555 | Snapshot too old | Увеличить UNDO_RETENTION, уменьшить длительность транзакции |
| ORA-01652 | Не удаётся расширить temp-сегмент | Увеличить TEMP tablespace |
| ORA-04031 | Не хватает памяти в shared pool | Увеличить SHARED_POOL_SIZE или включить ASMM |
| ORA-12514 | TNS:listener does not know of service | Проверить tnsnames.ora, listener.ora, статус listener |
| ORA-12899 | Значение слишком велико для столбца | Увеличить размер столбца или обрезать данные |
26.2. Инструменты диагностики
-
ADRCI (Automatic Diagnostic Repository Command Interpreter):
adrci
show alert
show incident -
Trace-файлы: находятся в
$ADR_HOME/trace/, содержат детали ошибок. -
SQL Trace + TKPROF:
ALTER SESSION SET SQL_TRACE = TRUE;
-- выполнить запрос
EXIT;Затем обработать:
tkprof ora_12345.trc output.txt
27. Проектирование схем базы данных
27.1. Нормализация
- 1NF — атомарные значения
- 2NF — отсутствие частичных зависимостей
- 3NF — отсутствие транзитивных зависимостей
- BCNF — каждая детерминанта — кандидатский ключ
27.2. Денормализация
Применяется в хранилищах данных для ускорения аналитических запросов.
27.3. Именование
Рекомендации:
- Таблицы:
employees,order_items - Первичные ключи:
employee_id - Внешние ключи:
department_id(ссылающийся наdepartments.department_id) - Индексы:
idx_emp_dept,pk_employees - Последовательности:
emp_seq
27.4. Ограничения
- PRIMARY KEY — гарантирует уникальность и NOT NULL
- FOREIGN KEY — ссылочная целостность
- CHECK — бизнес-правила (
salary > 0) - UNIQUE — уникальность без NOT NULL
- NOT NULL — обязательное заполнение
27.5. Последовательности и идентификаторы
CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1 NOCACHE;
-- Или автоинкремент (12c+):
CREATE TABLE employees (
id NUMBER GENERATED ALWAYS AS IDENTITY,
name VARCHAR2(100)
);
28. Комплексные рекомендации по эксплуатации
28.1. Резервное копирование
- Ежедневный RMAN backup уровня 0 (полный) + уровень 1 (инкрементальный).
- Архивные логи — каждый час.
- Тестирование восстановления — ежеквартально.
- Хранение копий вне дата-центра.
28.2. Мониторинг
- Настройка Enterprise Manager Cloud Control или OEM Express.
- Алерты на:
- Заполнение табличных пространств (>85%)
- Долгие запросы (>5 сек)
- Ошибки в alert log
- Превышение PGA/SGA
28.3. Безопасность
- Отключение учётных записей по умолчанию (
SCOTT,HR). - Регулярная смена паролей.
- Использование профилей:
CREATE PROFILE app_profile LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1
PASSWORD_LIFE_TIME 90;
ALTER USER app_user PROFILE app_profile;
28.4. Производительность
- Избегать
SELECT *. - Использовать bind-переменные.
- Регулярно собирать статистику.
- Анализировать планы выполнения перед продакшеном.
- Ограничивать параллелизм для OLTP.
28.5. Документирование
- Хранить DDL-скрипты в системе контроля версий.
- Фиксировать все изменения через change management.
- Поддерживать актуальную ER-диаграмму.